package com.gwt.boot.tools;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtTools {
    /**
     * 发行方
     */
    private static final String ISSUER = "GWT";
    /**
     * 接收方
     */
    private static final String AUDIENCE = "GWT-VUE";
    /**
     * jwt加解密使用的密钥;
     */
    private static final String SECRET = "p0o9i8u7.com";

    /**
     * 根据用户信息生成token
     */
    public static String createToken(Object userId, Date expDate) {
        Date now = new Date(System.currentTimeMillis());
        return Jwts.builder()
                .setSubject(userId.toString())//主题
                .setIssuer(ISSUER)//发行方
                .setAudience(AUDIENCE)//接收方
                .setIssuedAt(now)//签发日期
                .setNotBefore(now)//生效日期
                .setExpiration(expDate)//失效时间
                .signWith(SignatureAlgorithm.HS512, SECRET)//生成算法
                .compact();
    }

    /**
     * 解析Jwt
     * @param token token
     * @return Claims
     */
    public static Claims getClaims(String token) {
        Claims claims;
        try {
            claims = Jwts.parser()
                    .setSigningKey(SECRET)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (ExpiredJwtException e) {
            // Jwt过期异常
            claims = e.getClaims();
        } catch (Exception e) {
            //解析异常，非法token
            //throw BusinessException.error(ApiResultEnum.SHAM_TOKEN.getStatus(), ApiResultEnum.SHAM_TOKEN.getMessage());
            throw new RuntimeException();
        }
        return claims;
    }

    /**
     * 从token中获取登录用户名
     */
    public static String getUserId(String token) {
        return getClaims(token).getSubject();
    }
    /**
     * 判断token是否已经失效
     * @param token token
     * @return boolean
     */
    public static boolean isExpired(String token) {
        Date expiredDate = getClaims(token).getExpiration();
        if (expiredDate == null){
            return true;
        }
        return expiredDate.before(new Date());
    }
}
